package br.com.sis.rh.facade;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.sis.rh.dao.AlocacaoDAO;
import br.com.sis.rh.dao.AvaliacaoDAO;
import br.com.sis.rh.dao.CandidatoDAO;
import br.com.sis.rh.dao.CargoPretendidoDAO;
import br.com.sis.rh.dao.CursoExtraDAO;
import br.com.sis.rh.dao.DadosPessoaisDAO;
import br.com.sis.rh.dao.EnderecoDAO;
import br.com.sis.rh.dao.GraduacaoProfissionalDAO;
import br.com.sis.rh.dao.IdiomaDominadoDAO;
import br.com.sis.rh.dao.PosGraduacaoProfissionalDAO;
import br.com.sis.rh.dao.PretencaoSalarialDAO;
import br.com.sis.rh.dao.RemuneracaoDAO;
import br.com.sis.rh.entity.Alocacao;
import br.com.sis.rh.entity.Candidato;
import br.com.sis.rh.entity.CargoPretendido;
import br.com.sis.rh.entity.CursoExtra;
import br.com.sis.rh.entity.Entidade;
import br.com.sis.rh.entity.GraduacaoProfissional;
import br.com.sis.rh.entity.IdiomaDominado;
import br.com.sis.rh.entity.PosGraduacaoProfissional;

@Service
@Transactional
public class CandidatoFacadeImpl extends GenericFacadeImpl<Candidato, CandidatoDAO> implements CandidatoFacade {

	public CandidatoFacadeImpl() {
		super(CandidatoDAO.class);
	}

	@Autowired
	private CandidatoDAO candidatoDAO;
	
	@Autowired
	private EnderecoDAO enderecoDAO;
	
	@Autowired
	private AlocacaoDAO alocacaoDAO;
	
	@Autowired
	private DadosPessoaisDAO dadosPessoaisDAO;
	
	@Autowired
	private GraduacaoProfissionalDAO graduacaoProfissionalDAO;
	
	@Autowired
	private PosGraduacaoProfissionalDAO posGraduacaoProfissionalDAO;
	
	@Autowired
	private CursoExtraDAO cursoExtraDAO;
	
	@Autowired
	private CargoPretendidoDAO cargoPretendidoDAO;
	
	@Autowired
	private IdiomaDominadoDAO idiomaDominadoDAO;
	
	@Autowired
	private PretencaoSalarialDAO pretencaoSalarialDAO;
	
	@Autowired
	private RemuneracaoDAO remuneracaoDAO;
	
	@Autowired
	private AvaliacaoDAO avaliacaoDAO;
	
	@Override
	public void incluir(Candidato objeto) {
		enderecoDAO.incluir(objeto.getDadosPessoais().getEndereco());
		dadosPessoaisDAO.incluir(objeto.getDadosPessoais());
		
		Date teste = new Date();
		
		objeto.setDataAtualizacao(teste);
		
		candidatoDAO.incluir(objeto);
	}

	@Override
	public void alterar(Candidato objeto) {
		enderecoDAO.alterar(objeto.getDadosPessoais().getEndereco());
		dadosPessoaisDAO.alterar(objeto.getDadosPessoais());
		
		Candidato candidatoAlterado = candidatoDAO.recuperarCandidatoAux(objeto.getId());
		
		Date dataCorrente = new Date();

		objeto.setAlocacao(candidatoAlterado.getAlocacao());
		objeto.setAreaAtuacao(candidatoAlterado.getAreaAtuacao());
		objeto.setCargoPretendido(candidatoAlterado.getCargoPretendido());
		objeto.setCompetencia(candidatoAlterado.getCompetencia());
		objeto.setCursoExtra(candidatoAlterado.getCursoExtra());
		objeto.setGraduacaoProfissional(candidatoAlterado.getGraduacaoProfissional());
		objeto.setIdiomaDominado(candidatoAlterado.getIdiomaDominado());
		objeto.setPosGraduacaoProfissional(candidatoAlterado.getPosGraduacaoProfissional());
		objeto.setSegmento(candidatoAlterado.getSegmento());
		objeto.setVaga(candidatoAlterado.getVaga());
		objeto.setUsuario(candidatoAlterado.getUsuario());
		objeto.setRemuneracao(candidatoAlterado.getRemuneracao());
		objeto.setPretensaoSalarial(candidatoAlterado.getPretensaoSalarial());
		objeto.setAvaliacao(candidatoAlterado.getAvaliacao());
		
//		BeanUtils.copyProperties(candidatoAlterado, objeto);
		
		objeto.setDataAtualizacao(dataCorrente);
		
		candidatoDAO.alterar(objeto);
	}

	@Override
	public void incluirAreasAtuacao(Candidato candidato) {
		candidatoDAO.incluirAreasAtuacao(candidato);
	}
	
	@Override
	public void incluirSegmentos(Candidato candidato) {
		candidatoDAO.incluirSegmentos(candidato);
	}

	@Override
	public void incluirCompetencias(Candidato candidato) {
		candidatoDAO.incluirCompetencias(candidato);
	}

	@Override
	public void incluirAlocacao(Candidato candidato) {
		for(Alocacao alocacao : candidato.getAlocacao()) {
			alocacaoDAO.incluir(alocacao);
		}

		candidatoDAO.incluirAlocacao(candidato);
	}

	@Override
	public void incluirGraduacaoProfissional(Candidato candidato) {
		for(GraduacaoProfissional gp : candidato.getGraduacaoProfissional()) {
			graduacaoProfissionalDAO.incluir(gp);
		}

		candidatoDAO.incluirGraduacaoProfissional(candidato);
	}

	@Override
	public void incluirCursosExtras(Candidato candidato) {
		for(CursoExtra cx : candidato.getCursoExtra()) {
			cursoExtraDAO.incluir(cx);
		}
		
		candidatoDAO.incluirCursoExtra(candidato);
	}

	@Override
	public void incluirPosGraduacao(Candidato candidato) {
		for(PosGraduacaoProfissional pos : candidato.getPosGraduacaoProfissional()) {
			posGraduacaoProfissionalDAO.incluir(pos);
		}

		candidatoDAO.incluirPosGraduacao(candidato);
	}

	@Override
	public void incluirCargoPretendido(Candidato candidato) {
		for(CargoPretendido cargo : candidato.getCargoPretendido()) {
			cargoPretendidoDAO.incluir(cargo);
		}

		candidatoDAO.incluirCargoPretendido(candidato);
	}
	
	@Override
	public void incluirIdiomaDominado(Candidato candidato) {
		for(IdiomaDominado idiomaDominado : candidato.getIdiomaDominado()) {
			idiomaDominadoDAO.incluir(idiomaDominado);
		}

		candidatoDAO.incluirIdiomaDominado(candidato);
	}
	
	@Override
	public void incluirPretensaoSalarial(Candidato candidato) {
		pretencaoSalarialDAO.incluir(candidato.getPretensaoSalarial());
		
		candidatoDAO.incluirPretensaoSalarial(candidato);
	}
	
	@Override
	public void incluirRemuneracao(Candidato candidato) {
		remuneracaoDAO.incluir(candidato.getRemuneracao());
		
		candidatoDAO.incluirRemuneracao(candidato);
	}	

	@Override
	public void incluirAvaliacao(Candidato candidato) {
		avaliacaoDAO.incluir(candidato.getAvaliacao());
		
		candidatoDAO.incluirAvaliacao(candidato);
	}
	
	@Override
	public Candidato listarPorObjeto(Entidade objeto, String joinTable) {
		return candidatoDAO.listarPorObjeto(objeto, joinTable);
	}

	@Override
	public List<Candidato> consultaBasica(Candidato candidato, String valorPesquisado) {
		String [] campos = {"dadosPessoais.nome","dadosPessoais.sobrenome","dadosPessoais.cpf","dadosPessoais.email","alocacao.empresa.razaoSocial","alocacao.empresa.nomeFantasia"};

		return candidatoDAO.listarHS(candidato, campos, valorPesquisado);
	}

}
